#ifndef _KEY_MANAGER_H_
#define _KEY_MANAGER_H_

#include "./SYSTEM/sys/sys.h"
#include "./BSP/KEY/cot_key.h"

/* -------------------------------------------- 功能开关宏定义 -------------------------------------------- */

/**
 * @brief 触摸按键功能开关
 * @note  触摸按键使用PA5引脚和TIM2定时器，如果其他功能需要使用这些资源，请将此宏设置为0
 *        1: 启用触摸按键功能 (默认)
 *        0: 禁用触摸按键功能，释放PA5引脚和TIM2资源供其他功能使用
 */
#define ENABLE_TPAD_KEY         0

#if ENABLE_TPAD_KEY
#include "./BSP/TPAD/tpad.h"
#endif

/* -------------------------------------------- 按键引脚定义 -------------------------------------------- */

#define KEY0_GPIO_PORT              GPIOE
#define KEY0_GPIO_PIN               GPIO_PIN_4
#define KEY0_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)         /* PE口时钟使能 */

#define KEY1_GPIO_PORT              GPIOE
#define KEY1_GPIO_PIN               GPIO_PIN_3
#define KEY1_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)         /* PE口时钟使能 */

#define KEY2_GPIO_PORT              GPIOE
#define KEY2_GPIO_PIN               GPIO_PIN_2
#define KEY2_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)         /* PE口时钟使能 */

#define WKUP_GPIO_PORT              GPIOA
#define WKUP_GPIO_PIN               GPIO_PIN_0
#define WKUP_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)         /* PA口时钟使能 */

/* -------------------------------------------- 按键状态定义 -------------------------------------------- */

/* 按键位码定义 */
#define KEY_CODE_0                  (1 << 0)    /* 按键0的位码 */
#define KEY_CODE_1                  (1 << 1)    /* 按键1的位码 */
#define KEY_CODE_2                  (1 << 2)    /* 按键2的位码 */
#define KEY_CODE_WKUP               (1 << 3)    /* 按键WKUP的位码 */
#if ENABLE_TPAD_KEY
#define KEY_CODE_TPAD               (1 << 4)    /* 按键TPAD的位码 */
#endif

/* 按键GPIO读取宏定义 */
#define GPIO_GET_KEY0()             !HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN)    /* 读取KEY0状态 */
#define GPIO_GET_KEY1()             !HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN)    /* 读取KEY1状态 */
#define GPIO_GET_KEY2()             !HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN)    /* 读取KEY2状态 */
#define GPIO_GET_KEYWKUP()          HAL_GPIO_ReadPin(WKUP_GPIO_PORT, WKUP_GPIO_PIN)     /* 读取WKUP状态 */
#if ENABLE_TPAD_KEY
#define GPIO_GET_KEYTPAD()          tpad_scan(1)                                        /* 读取TPAD状态 */
#endif

/* 组合扫描码生成 */
#if ENABLE_TPAD_KEY
#define GPIO_GetKEY()               (GPIO_GET_KEY0() << 0 | (GPIO_GET_KEY1() << 1) | (GPIO_GET_KEY2() << 2) | (GPIO_GET_KEYWKUP() << 3) | (GPIO_GET_KEYTPAD() << 4))
#else
#define GPIO_GetKEY()               (GPIO_GET_KEY0() << 0 | (GPIO_GET_KEY1() << 1) | (GPIO_GET_KEY2() << 2) | (GPIO_GET_KEYWKUP() << 3))
#endif

/* -------------------------------------------- 按键ID定义 -------------------------------------------- */

typedef enum
{
    KEY0 = 0,       /* 按键0 */
    KEY1,           /* 按键1 */
    KEY2,           /* 按键2 */
    WKUP,           /* 按键WKUP */
#if ENABLE_TPAD_KEY
    TPAD,           /* 按键TPAD */
#endif

    KEY_MAX_NUM     /* 按键总数 */
} KEY_ID;

/* -------------------------------------------- 函数声明 ---------------------------------------------- */

void FML_KEY_Init(void);

#endif
